package com.yh.service;

import com.yh.entity.LanguageVersion;
import com.yh.entity.Movie;
import com.yh.entity.MovieCountry;
import com.yh.entity.MovieType;
import com.yh.vo.MovieVO;

import java.util.List;

/**
 * @author yuhuan
 * @date 2022/01/13
 */
public interface MovieService {
    /**
     * 查询所有的电影信息；忽略被标记为删除状态的影片
     *
     * @return 返回查询到的所有影片信息
     */
    public List<Movie> findMovieAll();

    /**
     * 根据ID查询影片信息（优先到缓存中获取，没有才查数据库）；忽略被标记为删除状态的影片
     *
     * @param movieId 影片的ID
     * @return 返回查询到的影片基本信息；如果影片不存在或者为空，将直接返回NULL
     */
    public Movie findMovieById(int movieId);

    /**
     * 根据ID查询影片信息（优先到缓存中获取，没有才查数据库）；该方法会查询被标记为删除状态的影片
     *
     * @param movieId 影片的ID
     * @return 返回查询到的影片基本信息
     */
    public Movie findMovieByIdNeedIgnoreState(int movieId);

    /**
     * 根据ID查询电影详情信息；忽略被标记为删除状态的影片，如果查询到的影片信息为空，将直接返回NULL
     *
     * @param movieId 影片的ID
     * @return 返回查询到的影片详情（包括影片的基本信息+导演信息+演职列表）
     */
    public MovieVO findMovieDetailById(int movieId);

    /**
     * 根据ID到redis缓存中查询电影详情信息，如果没有找到就到数据库查找，并把结果缓存到redis；缓存
     * 时，将自动忽略被标记为删除状态的影片
     *
     * @param movieId 影片的ID
     * @return 返回查询到的影片详情
     */
    public MovieVO findMovieDetailByIdFromRedis(int movieId);

    /**
     * 根据ID查询影片信息，需要处理主演的姓名（优先到缓存中获取，没有才查数据库）；将自动忽略被标记
     * 为删除状态的影片
     *
     * @param movieId 影片的ID
     * @return 返回查询到的影片基本信息，查询到被忽略的影片时返回NULL
     */
    public MovieVO findMovieByIdNeedStarName(int movieId);

    /**
     * 影片信息预热（查询高分电影详情到缓存并将所有影片的关键信息保存到搜索引擎）；忽略被标记为删除
     * 的影片
     *
     * @return 返回预热的结果
     */
    public Boolean moviePreheatToRedis();

    /**
     * 添加影片
     *
     * @param movieVO 需要添加的影片信息
     * @return 返回添加的总记录数
     */
    public int addMovie(MovieVO movieVO);

    /**
     * 修改影片记录
     *
     * @param movieVO 需要修改的影片信息
     * @return 返回修改的总记录数
     */
    public int updateMovie(MovieVO movieVO);

    /**
     * 删除影片记录
     *
     * @param movieId 影片的ID
     * @return 返回删除的总记录数
     */
    public int deleteMovie(int movieId);

    /**
     * 查找所有的语言版本
     *
     * @return 返回查询到的所有版本信息
     */
    public List<LanguageVersion> findLanguageVersionAll();

    /**
     * 查询所有的电影类型
     *
     * @return 返回查询到的所有类型信息
     */
    public List<MovieType> findMovieTypeAll();

    /**
     * 新增影片类型
     *
     * @param type 需要添加的类型信息
     * @return 返回添加的总记录数
     */
    public int addMovieType(MovieType type);

    /**
     * 查询所有的制片地址
     *
     * @return 返回查询到的所有地址信息
     */
    public List<MovieCountry> findMovieCountryAll();

    /**
     * 添加制片区域
     *
     * @param country 需要添加的区域信息
     * @return 返回添加的总记录数
     */
    public int addMovieCountry(MovieCountry country);
}